/**
 * Description:
 * Date: 2025-10-09
 * Time: 22:34
 */

/*
关于静态的成员方法的注意：
    1.在静态方法中，不能直接调用非静态的成员变量或成员方法
    因为：静态方法 不依赖于对象 可以直接通过类名来访问
    但是：非静态方法 依赖对象，需要通过对象的引用来访问。（即在静态的方法中通过new一个新对象后，再来访问非静态的成员方法或变量）
* */
class Stu {
     String name;
     int age;
     String stuNum;

     //此时className是共有的一个相同数值的变量，当用关键字 static 修饰时，就不需要每个对象都进行赋值，直接使用就可以
    //此时calssName是一个类变量，即静态的成员变量，它不依赖于对象，它位于方法区中，是多个对象共用的
    public static String className = "1班";//同时对它进行初始化

    //注意：构造代码块的使用取决于我们 调用了哪个构造代码块
    public Stu(String name, int age, String stuNum) {
        this.name = name;
        this.age = age;
        this.stuNum = stuNum;
        System.out.println("这是排在前面的构造代码块");
    }

    public Stu() {
        System.out.println("这就是一个构造代码块...也是构造方法");
    }

    {
        System.out.println("这是排在前面的实例代码块");
    }

    //当出现多个静态代码块时，执行顺序是按照前后顺序来执行(即相同代码块的执行顺序就是按在编程中的前后顺序来执行)
    static {
        System.out.println("这是排在上面的静态代码块");
    }



    {
        System.out.println("这就是一个实例代码块...");
    }

    //用static修饰的代码块
    static {
        System.out.println("这就是一个静态代码块...");
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    @Override
    public String toString() {
        return "Stu{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", stuNum='" + stuNum + '\'' +
                ", className='" + className + '\'' +
                '}';
    }

    public static void main(String[] args) {
        //静态代码块的执行时在类加载时同步执行的，在类的生命周期中，只会执行一次
        //而实例代码块和构造代码块的执行则是在 实例化对象 时执行的，也就是new一个对象才会执行

        //你new了多个对象，那就会执行多次的实例代码块和构造代码块，但静态代码块则只会执行类加载时的一次，不会随着类的实例化而执行多次
        Stu stu = new Stu();
        stu.name = "zhangsan";
        stu.age = 18;
        stu.stuNum = "1000";
        className = "3班";
        System.out.println(stu);

        //此时我设置了空引用stu1来访问类变量className，没有发生错误，更加说明了被static修饰的类变量不依赖于对象，而是属于类
        Stu stu1 = null;
        System.out.println(stu1.className);

    }
}
public class Demo {
    public static void main(String[] args) {
        Stu stu = new Stu();
        stu.name = "zhangsan";
        stu.age = 18;
        stu.stuNum = "1000";
        Stu.className = "2班";//类变量一般时通过类来访问

        System.out.println(stu);

        System.out.println("================");

        Stu stu1 = new Stu();
        stu1.name = "lisi";
        stu1.age = 11;
        stu1.stuNum = "2000";

        System.out.println(stu1);

    }

}
